home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs53.d81 / 28may87s.pma / CPM3.LIB < prev    next >
Text File  |  1979-12-31  |  4KB  |  180 lines

  1. ;    Macro Definitions for CP/M3 BIOS Data Structures.
  2.  
  3.     ; dtbl    <dph0,dph1,...>        - drive table
  4.  
  5.     ; dph    translate$table,    - disk parameter header
  6.     ;    disk$parameter$block,
  7.     ;    checksum$size,            (optional)
  8.     ;    alloc$size            (optional)
  9.  
  10.     ; skew    sectors,        - skew table
  11.     ;    skew$factor,
  12.     ;    first$sector$number
  13.  
  14.     ; dpb    physical$sector$size,    - disk parameter block
  15.     ;    physical$sectors$per$track,
  16.     ;    number$tracks,
  17.     ;    block$size,
  18.     ;    number$dir$entries,
  19.     ;    track$offset,
  20.     ;    checksum$vec$size        (optional)
  21.  
  22.  
  23. ;    Drive Table.  Contains 16 one word entries.
  24.  
  25. dtbl macro ?list
  26.     local ?n
  27. ?n  set 0
  28.     irp ?drv,<?list>
  29. ?n  set ?n+1
  30.     dw    ?drv
  31.     endm
  32.  
  33.     if ?n > 16
  34. .' Too many drives.  Max 16 allowed'
  35.     exitm
  36.     endif
  37.  
  38.     if ?n < 16
  39.     rept (16-?n)
  40.     dw    0
  41.     endm
  42.     endif
  43.  endm
  44.  
  45. dph macro ?trans,?dpb,?csize,?asize
  46.     local ?csv,?alv
  47.     dw ?trans        ; translate table address
  48.     db 0,0,0,0,0,0,0,0,0    ; BDOS Scratch area
  49.     db 0            ; media flag
  50.     dw ?dpb            ; disk parameter block
  51.     if not nul ?csize
  52.     dw ?csv            ; checksum vector
  53.     else
  54.     dw 0FFFEh        ; checksum vector allocated by
  55.     endif            ; GENCPM
  56.     if not nul ?asize
  57.     dw ?alv            ; allocation vector
  58.     else
  59.     dw 0FFFEh        ; alloc vector allocated by GENCPM
  60.     endif
  61.     dw 0fffeh,0fffeh,0fffeh    ; dirbcb, dtabcb, hash alloc'd
  62.                 ; by GENCPM
  63.     db 0            ; hash bank
  64.  
  65.     if not nul ?csize
  66. ?csv    ds    ?csize        ; checksum vector
  67.     endif
  68.     if not nul ?asize
  69. ?alv    ds    ?asize        ; allocation vector
  70.     endif
  71.  
  72.     endm
  73.  
  74. dpb macro ?psize,?pspt,?trks,?bls,?ndirs,?off,?ncks
  75.     local ?spt,?bsh,?blm,?exm,?dsm,?drm,?al0,?al1,?cks,?psh,?psm
  76.     local ?n
  77. ;; physical sector mask and physical sector shift
  78.     ?psh    set 0
  79.     ?n        set ?psize/128
  80.     ?psm    set ?n-1
  81.     rept 8
  82.     ?n    set ?n/2
  83.          if ?n = 0 
  84.         exitm
  85.         endif
  86.     ?psh    set ?psh + 1
  87.     endm
  88.     ?spt    set ?pspt*(?psize/128)
  89.  
  90.     ?bsh    set 3
  91.     ?n        set ?bls/1024
  92.     rept 8
  93.     ?n    set ?n/2
  94.         if ?n = 0
  95.         exitm
  96.         endif
  97.     ?bsh    set ?bsh + 1
  98.     endm
  99.     ?blm    set ?bls/128-1
  100.     ?size    set (?trks-?off)*?spt
  101.     ?dsm    set ?size/(?bls/128)-1
  102.  
  103.     ?exm    set ?bls/1024
  104.     if ?dsm > 255
  105.         if ?bls = 1024
  106. .'Error, can''t have this size disk with 1k block size'
  107.         exitm
  108.         endif
  109.     ?exm    set ?exm/2
  110.     endif
  111.     ?exm    set ?exm-1
  112.     ?all    set 0
  113.     ?n        set (?ndirs*32+?bls-1)/?bls
  114.     rept ?n
  115.     ?all    set (?all shr 1) or 8000h
  116.     endm
  117.     ?al0    set high ?all
  118.     ?al1    set low ?all
  119.     ?drm    set ?ndirs-1
  120.     if not nul ?ncks
  121.         ?cks    set ?ncks
  122.     else
  123.     ?cks    set ?ndirs/4
  124.     endif
  125.     dw    ?spt        ; 128 byte records per track
  126.     db    ?bsh,?blm    ; block shift and mask
  127.     db    ?exm        ; extent mask
  128.     dw    ?dsm        ; maximum block number
  129.     dw    ?drm        ; maximum directory entry number
  130.     db    ?al0,?al1    ; alloc vector for directory
  131.     dw    ?cks        ; checksum size
  132.     dw    ?off        ; offset for system tracks
  133.     db    ?psh,?psm    ; physical sector size shift
  134.                 ; and mask
  135.     endm
  136.  
  137. ;
  138. gcd macro ?m,?n
  139.         ;;    greatest common divisor of m,n
  140.             ;;    produces value gcdn as result
  141.             ;;    (used in sector translate table generation)
  142.     ?gcdm    set ?m    ;;variable for m
  143.     ?gcdn    set ?n    ;;variable for n
  144.     ?gcdr    set 0    ;;variable for r
  145.     rept 65535
  146.     ?gcdx    set ?gcdm/?gcdn
  147.     ?gcdr    set ?gcdm - ?gcdx*?gcdn
  148.         if ?gcdr = 0
  149.         exitm
  150.         endif
  151.     ?gcdm    set ?gcdn
  152.     ?gcdn    set ?gcdr
  153.     endm
  154.     endm
  155.  
  156. skew macro ?secs,?skf,?fsc
  157. ;;    generate the translate table
  158.     ?nxtsec    set 0    ;;next sector to fill
  159.     ?nxtbas    set 0    ;;moves by one on overflow
  160.     gcd %?secs,?skf
  161.     ;;    ?gcdn = gcd(?secs,skew)
  162.     ?neltst    set ?secs/?gcdn
  163.     ;;    neltst is number of elements to generate
  164.     ;;    before we overlap previous elements
  165.     ?nelts    set ?neltst    ;;counter
  166.     rept ?secs    ;;once for each sector
  167.     db    ?nxtsec+?fsc
  168.     ?nxtsec    set ?nxtsec+?skf
  169.         if ?nxtsec >= ?secs
  170.         ?nxtsec    set ?nxtsec-?secs
  171.         endif
  172.     ?nelts    set ?nelts-1
  173.         if ?nelts = 0
  174.         ?nxtbas    set ?nxtbas+1
  175.         ?nxtsec    set ?nxtbas
  176.         ?nelts    set ?neltst
  177.         endif
  178.     endm
  179.     endm
  180.